package com.quanxiaoha.framework.biz.context.filter;


import com.quanxiaoha.framework.biz.context.holder.LoginUserContextHolder;
import com.quanxiaoha.framework.common.constant.GlobalConstants;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import java.io.IOException;

/**
 * @Author: jingyan_liu
 * @CreateTime: 2025-07-14
 * @Description: 提取请求头中的用户 ID 保存到上下文中，以方便后续使用
 * @Version: 1.0
 */


@Component
@Slf4j
public class HeaderUserId2ContextFilter extends OncePerRequestFilter {
	//guarantee a single execution per request dispatch, on any servlet container
	
	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
	                                FilterChain chain) throws ServletException, IOException {
		
		// 从请求头中获取用户 ID
		String userId = request.getHeader(GlobalConstants.USER_ID);
		
		log.info("## HeaderUserId2ContextFilter, 用户 ID: {}", userId);
		
		// 判断请求头中是否存在用户 ID
		if (StringUtils.isBlank(userId)) {
			// 若为空，则直接放行
			chain.doFilter(request, response);
			// 返回的时候，检查 response 对象，修改响应头和响应正文
			return;
		}
		
		// 如果 header 中存在 userId，则设置到 ThreadLocal 中
		log.info("===== 设置 userId 到 ThreadLocal 中， 用户 ID: {}", userId);
		LoginUserContextHolder.setUserId(userId);
		
		try {
			//将请求传递给下一个过滤器或目标资源
			chain.doFilter(request, response);
		} finally {
			//目标资源生成响应信息返回客户端之前，处理控制权会再次回到 Filter 的 doFilter() 方法，执行 FilterChain.doFilter() 后的语句，
			// 检查 response 对象，修改响应头和响应正文
			LoginUserContextHolder.remove();
			log.info("===== 删除 ThreadLocal， userId: {}", userId);
		}
	}
}
